package com.zhuqieli.database_learn.utils;


import com.zhuqieli.database_learn.enummeration.ReturnStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = true)
public class MyException extends RuntimeException {

    /**
     * 错误编码
     */
    private String errorCode;

    /**
     * 消息是否为属性文件中的Key
     */
    private boolean propertiesKey = true;

    /**
     * 构造一个基本异常.
     *
     * @param message 信息描述
     */
    public MyException(String message) {

        super(message);
    }

    /**
     * 构造一个基本异常.
     *
     * @param e 信息描述
     */
    public MyException(Exception e) {

        super(e);
    }

    /**
     * 构造一个基本异常.
     *
     * @param errorCode 错误编码
     * @param message   信息描述
     */
    public MyException(String errorCode, String message) {

        this(errorCode, message, true);
    }

    /**
     * 构造一个基本异常.
     *
     * @param errorCode 错误编码
     * @param message   信息描述
     */
    public MyException(String errorCode, String message, Throwable cause) {

        this(errorCode, message, cause, true);
    }

    /**
     * 构造一个基本异常.
     *
     * @param errorCode     错误编码
     * @param message       信息描述
     * @param propertiesKey 消息是否为属性文件中的Key
     */
    public MyException(String errorCode, String message, boolean propertiesKey) {

        super(message);
        this.setErrorCode(errorCode);
        this.setPropertiesKey(propertiesKey);
    }

    /**
     * 构造一个基本异常.
     *
     * @param errorCode 错误编码
     * @param message   信息描述
     */
    public MyException(String errorCode, String message, Throwable cause, boolean propertiesKey) {

        super(message, cause);
        this.setErrorCode(errorCode);
        this.setPropertiesKey(propertiesKey);
    }

    /**
     * 构造一个基本异常.
     *
     * @param message 信息描述
     * @param cause   根异常类（可以存入任何异常）
     */
    public MyException(String message, Throwable cause) {

        super(message, cause);
    }

    /**
     * 构造一个基本异常.
     *
     * @param statusEnum 响应枚举
     */
    public MyException(ReturnStatusEnum statusEnum) {

        this(statusEnum.getCode(), statusEnum.getMsg());
    }

    /**
     * 构造一个基本异常.
     *
     * @param statusEnum   响应枚举
     * @param extraMessage 附加信息
     */
    public MyException(ReturnStatusEnum statusEnum, String... extraMessage) {

        this(statusEnum.getCode(), ReturnStatusEnum.getFullMessage(statusEnum.getMsg(), extraMessage));
    }

    public String getErrorCode() {

        return errorCode;
    }
}
